package br.com.jk.entidade;

import br.com.jk.endereco.Endereco;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.NaturalId;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

/**
 * "Teste de alteração"
 *
 * @author camilo
 */
@MappedSuperclass
public class Entidade implements Serializable {

  public static final String ATTRIBUTE_ID = "id";
  public static final String ATTRIBUTE_ENDERECO = "endereco";
  public static final String ATTRIBUTE_CNPJ = "cnpj";
  public static final String ATTRIBUTE_IE = "ie";
  public static final String ATTRIBUTE_RAZAO = "razao";
  public static final String ATTRIBUTE_FANTASIA = "fantasia";
  public static final String ATTRIBUTE_PFISICA = "pFisica";
  @Id
  @SequenceGenerator(name = EntidadeDao.NAME_SEQUENCE, sequenceName = EntidadeDao.NAME_SEQUENCE)
  @GeneratedValue(strategy = GenerationType.AUTO, generator = EntidadeDao.NAME_SEQUENCE)
  private int id;
  @OneToOne
  @JoinColumn(name = EntidadeDao.NAME_COLUMN_ENDERECO, nullable = false)
  @ForeignKey(name = EntidadeDao.NAME_FK_ENTIDADE_ENDERECO)
  @OnDelete(action = OnDeleteAction.CASCADE)
  private Endereco endereco;
  @NaturalId
  @Column(unique = true, nullable = false, name = EntidadeDao.NAME_COLUMN_CNPJ)
  private String cnpj;
  @NaturalId
  @Column(unique = true, nullable = false, name = EntidadeDao.NAME_COLUMN_IE)
  private String ie;
  @Column(name = EntidadeDao.NAME_COLUMN_RAZAO)
  private String razao;
  @Column(name = EntidadeDao.NAME_COLUMN_FANTASIA)
  private String fantasia;
  @Column(name = EntidadeDao.NAME_COLUMN_PFISICA)
  private Boolean pFisica;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public Endereco getEndereco() {
    return endereco;
  }

  public void setEndereco(Endereco endereco) {
    this.endereco = endereco;
  }

  public String getCnpj() {
    return cnpj;
  }

  public void setCnpj(String cnpj) {
    this.cnpj = cnpj;
  }

  public String getIe() {
    return ie;
  }

  public void setIe(String ie) {
    this.ie = ie;
  }

  public String getRazao() {
    return razao;
  }

  public void setRazao(String razao) {
    this.razao = razao;
  }

  public String getFantasia() {
    return fantasia;
  }

  public void setFantasia(String fantasia) {
    this.fantasia = fantasia;
  }

  public Boolean getpFisica() {
    return pFisica;
  }

  public void setpFisica(Boolean pFisica) {
    this.pFisica = pFisica;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 89 * hash + this.id;
    hash = 89 * hash + Objects.hashCode(this.endereco);
    hash = 89 * hash + Objects.hashCode(this.cnpj);
    hash = 89 * hash + Objects.hashCode(this.ie);
    hash = 89 * hash + Objects.hashCode(this.razao);
    hash = 89 * hash + Objects.hashCode(this.fantasia);
    hash = 89 * hash + Objects.hashCode(this.pFisica);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final Entidade other = (Entidade) obj;
    if (this.id != other.id) {
      return false;
    }
    if (!Objects.equals(this.endereco, other.endereco)) {
      return false;
    }
    if (!Objects.equals(this.cnpj, other.cnpj)) {
      return false;
    }
    if (!Objects.equals(this.ie, other.ie)) {
      return false;
    }
    if (!Objects.equals(this.razao, other.razao)) {
      return false;
    }
    if (!Objects.equals(this.fantasia, other.fantasia)) {
      return false;
    }
    if (!Objects.equals(this.pFisica, other.pFisica)) {
      return false;
    }
    return true;
  }
}
